package cn.wen.bases.dao.dbutils;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.log4j.Logger;

/**
 * Title: apache commons DbUtils 工具类
 * <p>
 * Description: 提供基本数据库操作。
 * <p>
 * Copyright: Copyright (c) 2010-2012
 * 
 * @author <a href="mailto:ct_wen@qq.com">ctwen</a>, 温承瑭
 * @version Revision: 1.0 Date: 2010/12/1 description：初完成。
 *          </P>
 */
public class DBUtil {

    private final Logger log = Logger.getLogger(getClass());

    private DataSource ds;

    /**
     * 置入数据源。
     * @param dataSource 数据源
     */
    public void setDataSource(DataSource dataSource) {
	this.ds = dataSource;
    }

    /**
     * 获取数据源。
     * @return 数据源
     */
    public DataSource getDataSource() {
	return this.ds;
    }

    /**
     * 执行指定SQL语句后返回一个指定类型的对象
     * 
     * @param clz 指定的类型
     * @param sql SQL语句
     * @param params 参数数组
     * @return 返回指定类型的对象，否则返回空！
     */
    public <T> T queryForBean(Class<T> clz, String sql, Object... params) {
	QueryRunner qr = new QueryRunner(ds);
	// log.debug("Sql Statement：" + sql);

	try {
	    return qr.query(sql, new BeanHandler<T>(clz), params);
	}
	catch (SQLException e) {
	    log.error(e.getMessage(), e);
	}
	// 若有误则返回空。
	return null;
    }

    /**
     * 执行指定SQL语句后返回一个指定类型的对象的List集合
     * 
     * @param clz 指定的类型
     * @param sql SQL语句
     * @param params 参数数组
     * @return 返回指定类型的对象的List集合，否则返回空！
     */
    public <T> List<T> queryForBeanList(Class<T> clz, String sql, Object... params) {
	QueryRunner qr = new QueryRunner(ds);
	// log.debug("Sql Statement：" + sql);

	try {
	    return qr.query(sql, new BeanListHandler<T>(clz), params);
	}
	catch (SQLException e) {
	    log.error(e.getMessage(), e);
	}
	// 若有误则返回空。
	return null;
    }

    /**
     * 执行指定SQL语句后返回一个Map对象
     * 
     * @param sql SQL语句
     * @param params 参数数组
     * @return 返回Map对象，否则返回空！
     */
    public Map<String, Object> queryForMap(String sql, Object... params) {
	QueryRunner qr = new QueryRunner(ds);
	// log.debug("Sql Statement：" + sql);

	try {
	    return qr.query(sql, new MapHandler(), params);
	}
	catch (SQLException e) {
	    log.error(e.getMessage(), e);
	}
	// 若有误则返回空。
	return null;
    }

    /**
     * 执行指定SQL语句后返回一个以Map对象为元素的List集合
     * 
     * @param sql SQL语句
     * @param params 参数数组
     * @return 返回以Map对象为元素的List集合，否则返回空！
     */
    public List<Map<String, Object>> queryForMapList(String sql, Object... params) {
	QueryRunner qr = new QueryRunner(ds);
	// log.debug("Sql Statement：" + sql);

	try {
	    return qr.query(sql, new MapListHandler(), params);
	}
	catch (SQLException e) {
	    log.error(e.getMessage(), e);
	}
	// 若有误则返回空。
	return null;
    }

    /**
     * 将执行指定SQL语句并返回影响行数 注：SQL语句只能为增，删，改（型）的SQL语句
     * 
     * @param sql SQL语句
     * @param param 参数数组
     * @return 影响行数
     */
    public Integer update(String sql, Object... params) {
	QueryRunner qr = new QueryRunner(ds);
	// log.debug("Sql Statement：" + sql);

	try {
	    return qr.update(sql, params);
	}
	catch (SQLException e) {
	    log.error(e.getMessage(), e);
	}
	return 0; // 若有误返回零
    }

}
